package com.knowledge.plus.web.filter;

import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 当一个HTTP请求到达Servlet容器时，它会经过一系列的过滤器。
 * 过滤器按照在web.xml（传统Web应用）或相应的Java配置类（Spring Boot应用）中的定义顺序执行
 */
@Configuration
public class RepeatableFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter init ...");
    }

    /**
     * 执行过滤器逻辑，对请求进行处理
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        System.out.println("request过滤");

        // 判断是否为JSON类型的HTTP请求，如果是则构建可重复读取的请求包装器
        if (request instanceof HttpServletRequest && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) {
            // 构建可重复读取 InputStream 的 Request
            requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
        }

        // 根据是否创建了请求包装器来决定使用原始请求还是包装后的请求继续过滤链
        if (null == requestWrapper) {
            chain.doFilter(request, response);
        } else {
            chain.doFilter(requestWrapper, response);
        }
    }

    @Override
    public void destroy() {

    }

}
